#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
利用 xlwings 操作 Excel
"""
__author__ = 'kevin'
__date__ = '2021/2/3'

import logging
import os
from pathlib import Path

import xlwings as xw

from pyexcel import utils
from pyexcel.excel import Excel


def _convert_file(file: Path, newfile: Path = None, method='to_xlsx'):
    """
    内部使用，调用请使用 convert 方法。
    转换文件
    :param file: 输入的文件
    :param method: 要使用的转换方法，可以使用 to_xlsx, to_pdf, dropformula
    :return: None
    """
    file = file if isinstance(file, Path) else Path(file)
    if not file.exists():
        raise FileNotFoundError(f'{file} 文件不存在！')
    method_dict = {
        'to_xlsx': file.with_suffix('.xlsx'),
        'to_pdf': file.with_suffix('.pdf'),
        'dropformula': file.with_name(f'{file.stem}_without_formula.xlsx'),
    }
    newfile = newfile or method_dict[method]
    with Excel(file) as ex:
        if method == 'to_xlsx':
            ex.to_xlsx(newfile)
        elif method == 'to_pdf':
            ex.to_pdf(newfile)
        elif method == 'dropformula':
            ex.drop_formula(newfile)
        else:
            raise ValueError(f'method 参数：{method} 传递错误，不在指定列表中。')


def _convert_dir(xls_dir: Path, method='to_xlsx'):
    """
    内部使用，调用请使用 convert 方法。
    传入一个目录，将目录内的所有 xls 转换为 xlsx 或 pdf 文件。

    :param xls_dir: 输入的目录
    :param method: 要使用的转换方法，可以使用 to_xlsx, to_pdf, dropformula
    :return: None
    """
    xls_dir = xls_dir if isinstance(xls_dir, Path) else Path(xls_dir)
    if not xls_dir.exists():
        raise FileNotFoundError(f'{xls_dir} 目录不存在！')
    length = len(xls_dir.parents)
    if method == 'to_xlsx':
        xls_path_list = xls_dir.rglob('*.xls')
    else:
        xls_path_list = xls_dir.rglob('*.xlsx')
    newfile_dir_dict = {
        'to_xlsx': f'{xls_dir.name}_xlsx',
        'to_pdf': f'{xls_dir.name}_pdf',
        'dropformula': f'{xls_dir.name}_without_formula',
    }
    newfile_suffix = '.pdf' if method == 'to_pdf' else '.xlsx'
    excel_file_num = 0
    with xw.App(visible=False, add_book=False) as app:
        for excel_file_num, file in enumerate(xls_path_list, 1):
            file_parts = list(file.parts)
            file_parts[length - 1] = newfile_dir_dict[method]
            newfile = Path(os.path.join(*file_parts)).with_suffix(newfile_suffix)
            newfile.parent.mkdir(parents=True, exist_ok=True)
            wb = app.books.open(file)
            if method == 'to_xlsx':
                utils.to_xlsx(wb, newfile)
            elif method == 'to_pdf':
                utils.to_pdf(wb, newfile)
            elif method == 'dropformula':
                utils.drop_formula(wb, newfile)
            else:
                raise ValueError(f'method 参数：{method} 传递错误，不在指定列表中。')
    if not excel_file_num:
        logging.warning(f'没有发现 excel 文件！')


def convert(xls_dir: str, method='to_xlsx'):
    """
    :param xls_dir: 输入的文件或目录
    :param method: 要使用的转换方法，可以使用 to_xlsx, to_pdf, dropformula
    :return: None
    """
    xls_path = Path(xls_dir) if isinstance(xls_dir, str) else xls_dir
    if xls_path.is_dir():
        _convert_dir(xls_path, method=method)
    elif xls_path.is_file():
        _convert_file(xls_path, method=method)
    else:
        logging.warning(f'{xls_dir} 不是是个合法的地址！')


def _test():
    convert(r"E:\test\Excel\test", method='dropformula')


def main():
    pass


if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')

    _test()
    # main()
